#include "../Interfaces/InterfazAdministrador.h"
#include <limits>

using namespace Interfaces;
using namespace ABM;

InterfazAdministrador::InterfazAdministrador() {
}

void InterfazAdministrador::menuPrincipal() {

	if (this->menuPantallaLogin())
		this->menuAdministrador();

}

bool InterfazAdministrador::menuPantallaLogin() {
	int intentosFallidos = 0;
	bool loginOK = false;
	do {
		system("clear");
		cout << "Menu Login Administrador: " << endl;
		cout << endl;
		cout << "Usuario: ";
		cin >> this->usuario;
		cout << " " << endl;
		cout << "contraseña: ";
		cin >> this->contrasenia;
		cout << " " << endl;
		if (!this->validarUsuarioYContraseniaAdmin(usuario, contrasenia)) {
			cout << endl;
			cout
					<< "Usuario/clave u opcion Incorrecta! Presione una tecla para continuar"
					<< endl;
			cin.ignore();
			getchar();
			loginOK = false;
			intentosFallidos++;
		} else {
			loginOK = true;
			break;
		}
	} while (intentosFallidos < 3);
	return loginOK;
}

void InterfazAdministrador::menuAdministrador() {
	bool fin = false;

	while (!fin) {
		system("clear");
		int opcionAdm = 0;
		cout << "Menu Administrador: " << endl;
		cout << "      1- ABM Votante" << endl;
		cout << "      2- ABM Distrito" << endl;
		cout << "      3- ABM Cargo" << endl;
		cout << "      4- ABM Eleccion" << endl;
		cout << "      5- ABM Candidato" << endl;
		cout << "      6- ABM Lista" << endl;
		cout << "      7- Ver Reportes" << endl;
		cout << "      8- Ver Logs" << endl;
		cout << "      9- Carga Masiva de datos" << endl;
		cout << "      10- Generar votaciones automáticas" << endl;
		cout << "      11- Volver" << endl;
		cout << endl;

		cout << "Elija la opcion: ";
		cin >> opcionAdm;
		cin.ignore();
		cout << endl;

		switch (opcionAdm) {
		case (1):
			this->menuABMVotante();
			break;
		case (2):
			this->menuABMDistrito();
			break;
		case (3):
			this->menuABMCargo();
			break;
		case (4):
			this->menuABMEleccion();
			break;
		case (5):
			this->menuABMCandidato();
			break;
		case (6):
			this->menuABMLista();
			break;
		case (7):
			this->menuReportes();
			break;
		case (8):
			this->menuLogs();
			break;
		case (9):
			this->altaMasivaDatos();
			break;
		case (10):
			this->menuVotantesAutomaticos();
			break;
		case (11):
			fin = true;
			break;
		default: {
			cout
					<< "Opcion Incorrecta! Presione cualquier tecla para volver al Menu"
					<< endl;
			cin.ignore();
			getchar();
		}
		}

	}

}

void InterfazAdministrador::menuABMVotante() {
	IAbm* votante = new VotanteABM();
	votante->menu();
	delete votante;
}

void InterfazAdministrador::menuABMDistrito() {
	IAbm* distrito = new DistritoABM();
	distrito->menu();
	delete distrito;
}

void InterfazAdministrador::menuABMEleccion() {
	IAbm* eleccion = new EleccionABM();
	eleccion->menu();
	delete eleccion;
}

void InterfazAdministrador::menuABMCandidato() {
	IAbm* candidato = new CandidatoABM();
	candidato->menu();
	delete candidato;
}

void InterfazAdministrador::menuABMLista() {
	IAbm* lista = new ListaABM();
	lista->menu();
	delete lista;
}

void InterfazAdministrador::menuABMCargo() {
	IAbm* cargo = new CargoABM();
	cargo->menu();
	delete cargo;
}

void InterfazAdministrador::menuReportes() {
	Configuracion* config = Configuracion::getInstancia();
	bool fin = false;
	bool resultado;
	int opcion = 0;
	while (!fin) {
		system("clear");

		cout << "Menu Reportes: " << endl;
		cout << "      1- Reporte por Distrito " << endl;
		cout << "      2- Reporte por Lista" << endl;
		cout << "      3- Reporte por Eleccion" << endl;
		cout << "      4- Volver" << endl;
		cout << "Elija la opcion: ";
		cin >> opcion;
		cout << endl;

		switch (opcion) {
		case (1):
			resultado = this->menuReportePorDistrito();
			break;
		case (2):
			resultado = this->menuReportePorLista();
			break;
		case (3):
			resultado = this->menuReportePorEleccion();
			break;
		case (4):
			opcion = 0;
			fin = true;
			break;
		default: {
			cout
					<< "Opcion Incorrecta! Presione cualquier tecla para volver al Menu"
					<< endl;
			getchar();
			opcion = 0;
			break;
		}
		}
		if (opcion != 0) {
			cout << endl;
			if (resultado) {
				cout
						<< "El reporte se genero correctamente, se encuentra en la carpeta : "
						<< config->getPathReportes() << endl;
				string abrir = "s";
				cout << "Desea abrir el archivo? (S/N) :";
				cin >> abrir;
				abrir = Utils::aMinuscula(abrir);
				string pathRepo = "";
				if (abrir == "s") {
					switch (opcion) {
						case (1):{
							pathRepo = "chmod 755 "+config->getPathReportes()+"reportePorDistrito.txt";
							system(pathRepo.c_str());
							pathRepo = "gedit "+config->getPathReportes()+"reportePorDistrito.txt";
							system(pathRepo.c_str());
							break;
						}
						case(2):{
							pathRepo = "chmod 755 "+config->getPathReportes()+"reportePorLista.txt";
							system(pathRepo.c_str());
							pathRepo = "gedit"+config->getPathReportes()+"reportePorLista.txt";
							system(pathRepo.c_str());
							break;
						}
						case (3):{
							pathRepo = "chmod 755 "+config->getPathReportes()+"reportePorEleccion.txt";
							system(pathRepo.c_str());
							pathRepo = "gedit"+config->getPathReportes()+"reportePorEleccion.txt";
							system(pathRepo.c_str());
							break;
						}
					}
				}
				getchar();
			} else {
				cout << "No existen datos para realizar el reporte " << endl;
				getchar();
			}
		}

	}
}

bool InterfazAdministrador::menuReportePorDistrito() {

	ManejadorConteo* manejadorConteo = new ManejadorConteo();
	string fecha = "";
	string distrito = "";
	cout << endl;
	cout << "Ingrese la FECHA de la eleccion: ";
	cin >> fecha;
	cin.ignore(numeric_limits<streamsize>::max(), '\n');

	cout << endl << "Ingrese el nombre del DISTRITO : ";
	getline(cin, distrito);

	bool resultado = manejadorConteo->reportePorDistrito(distrito, fecha);

	delete manejadorConteo;

	return resultado;
}

bool InterfazAdministrador::menuReportePorEleccion() {

	ManejadorConteo* manejadorConteo = new ManejadorConteo();
	string fecha = "";
	string cargo = "";
	cout << endl;
	cout << "Ingrese la FECHA de la eleccion: ";
	cin >> fecha;
	cin.ignore(numeric_limits<streamsize>::max(), '\n');

	cout << endl << "Ingrese el nombre del CARGO : ";
	getline(cin, cargo);

	bool resultado = manejadorConteo->reportePorEleccion(cargo, fecha);

	delete manejadorConteo;

	return resultado;

}

bool InterfazAdministrador::menuReportePorLista() {

	ManejadorConteo* manejadorConteo = new ManejadorConteo();
	string fecha = "";
	string cargo = "";
	string nombreLista = "";
	cout << endl;
	cout << "Ingrese la FECHA de la eleccion: ";
	cin >> fecha;
	cin.ignore(numeric_limits<streamsize>::max(), '\n');

	cout << endl << "Ingrese el nombre del CARGO : ";
	getline(cin, cargo);

	cout << endl << "Ingrese el nombre de la LISTA : ";
	getline(cin, nombreLista);

	bool resultado =
			manejadorConteo->reportePorLista(cargo, fecha, nombreLista);

	delete manejadorConteo;

	return resultado;

}
void InterfazAdministrador::menuLogs() {

	system("clear");
	Configuracion* config = Configuracion::getInstancia();
	cout << endl;
	cout << " El archivo de Logs se encuentra en la carpeta:"
			<< config->getPathReportes() << endl;
	string abrir = "s";
	cout << "Desea abrir el archivo? (S/N) :";
	cin >> abrir;
	abrir = Utils::aMinuscula(abrir);
	if (abrir == "s") {
		system("chmod 755 ../TPVotoElectronico/Reportes/log.txt ");
		system("gedit ../TPVotoElectronico/Reportes/log.txt");
	}
	cout << " Presione enter para volver al menu " << endl;
	cin.ignore();
	getchar();
}

void InterfazAdministrador::altaMasivaDatos() {
	system("clear");
	cout << "Iniciando alta masiva de datos" << endl;

	IAbm* entidad = new DistritoABM();
	llamadoAltaMasiva(entidad, "distritos");

	entidad = new AdministradorABM();
	llamadoAltaMasiva(entidad, "administradores");

	entidad = new CargoABM();
	llamadoAltaMasiva(entidad, "cargos");

	entidad = new VotanteABM();
	llamadoAltaMasiva(entidad, "votantes");

	entidad = new EleccionABM();
	llamadoAltaMasiva(entidad, "elecciones");

	entidad = new ListaABM();
	llamadoAltaMasiva(entidad, "listas");

	entidad = new CandidatoABM();
	llamadoAltaMasiva(entidad, "candidatos");

	cout << " Presione enter para volver al menu " << endl;
	getchar();

}

void InterfazAdministrador::llamadoAltaMasiva(IAbm* entidad,
		string nombreEntidad) {
	entidad->altaMasiva();
	cout << "alta de " << nombreEntidad << "..." << endl;
	delete entidad;
}

#include "../Accesorios/VotantesAutomaticos.h"
using namespace Accesorios;

void InterfazAdministrador::menuVotantesAutomaticos() {

	unsigned int cantidadDeVotacionesAutomaticas = 0;
	unsigned int votacionesEfectuadas = 0;

	system("clear");

	cout << "Menu de Votaciones Automáticas" << endl;
	cout
			<< "Ingrese la CANTIDAD de votaciones a realizar (0 si quiere que hacer votar a todos): ";
	cin >> cantidadDeVotacionesAutomaticas;
	cin.ignore(numeric_limits<streamsize>::max(), '\n');

	VotantesAutomaticos* votantesAutomaticos = new VotantesAutomaticos();

	votacionesEfectuadas = votantesAutomaticos->generarVotacionesAutomaticas(
			cantidadDeVotacionesAutomaticas);

	delete votantesAutomaticos;

	cout << "Votaciones terminadas. Se han efectuado " << votacionesEfectuadas
			<< " votaciones" << endl;
	cout << " Presione enter para volver al menu " << endl;
	getchar();

}

bool InterfazAdministrador::validarUsuarioYContraseniaAdmin(string usuario,
		string contrasenia) {
	bool validar = false;
	ManejadorAdministrador* manejadorAdministrador =
			new ManejadorAdministrador();
	Administrador* administrador = manejadorAdministrador->recuperar(usuario);
	if (administrador != NULL) {
		validar = administrador->validarContrasenia(contrasenia);
		delete administrador;
	}
	delete manejadorAdministrador;
	return validar;
}

InterfazAdministrador::~InterfazAdministrador() {
}
